package com.atguigu.gmall.ums.service.impl;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.ums.mapper.UserMapper;
import com.atguigu.gmall.ums.entity.UserEntity;
import com.atguigu.gmall.ums.service.UserService;


@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<UserEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<UserEntity>()
        );

        return new PageResultVo(page);
    }

    /**
     * 用户登录校验 主要包括对 type：1，用户名；2，手机；3，邮箱
     *
     * @param data
     * @param type
     * @return
     */
    @Override
    public Boolean check(String data, Integer type) {
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();

        switch (type) {
            case 1:
                wrapper.eq("username", data);
                break;
            case 2:
                wrapper.eq("phone", data);
                break;
            case 3:
                wrapper.eq("email", data);
                break;
            default:
                return null;
        }

        return this.count(wrapper) == 0;  // 返回布尔值 是否存在该用户 手机 邮箱  未查询到是TRUE 说明可用
    }

    /**
     * 注册用户 密码加盐 MD5加密
     *
     * @param userEntity
     * @param code
     */
    @Override
    public void register(UserEntity userEntity, String code) {
        //    - 1）校验短信验证码   忽略

        //    - 2）生成盐  设置到user中保存
        String salt = UUID.randomUUID().toString().substring(1, 6);
        userEntity.setSalt(salt);
        //    - 3）对密码加密  DigestUtils.md5Hex 加密
        userEntity.setPassword(DigestUtils.md5Hex(userEntity.getPassword() + salt));
        //    - 4）写入数据库
        userEntity.setLevelId(1L);
        userEntity.setNickname(userEntity.getUsername());
        userEntity.setSourceType(1);
        userEntity.setIntegration(1000);
        userEntity.setGrowth(1000);
        userEntity.setCreateTime(new Date());
        userEntity.setStatus(1);
        this.save(userEntity);
        //    - 5）删除Redis中的验证码  无
    }


    /**
     * 查询用户是否存在  根据参数中的登录名（用户名/手机号/邮箱）和密码查询指定用户
     *
     * @return
     */
    @Override
    public UserEntity queryUser(String loginName, String password) {
        // 根据登录名（用户名/手机号/邮箱）查询到用户
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("username", loginName).or().eq("phone", loginName).or().eq("email", loginName);
        UserEntity userEntity = this.getOne(wrapper);

        if (userEntity == null) {
            return userEntity;
        }

        // 判断加盐后的密码是否相同
        password = DigestUtils.md5Hex(password + userEntity.getSalt());
        boolean flag = StringUtils.equals(password, userEntity.getPassword());
        if (!flag) {

            return null;
        }
        return userEntity;
    }

}